/**
 * Author:kongguoguang
 * Date:2020/7/13
 * Time:19:12
 * 根据题意可将兔子分为三类：成年兔(可生小兔)、幼年兔（下个月可生小兔）和婴儿兔（本月出生，下下个月可生小兔）
 * 分别计算出这三类兔子的数量相加即可得出本月共有多少对兔子
 * 这三类兔子的数量存在以下递归关系：
 * 本月成年兔数量 = 上月成年兔数量 + 上月幼年兔数量
 * 本月幼年兔数量 = 上月婴儿兔数量
 * 本月婴儿兔数量 = 上月成年兔数量 + 上月幼年兔数量
 * 递归终止条件：1月份 成年兔数量 = 0，幼年兔数量 = 0，婴儿兔数量 = 1
 */
public class Rabbit {

    public static void main(String[] args) {
        int month = 12;
        int rabbitCount = getRabbitCount(month);
        System.out.println(month + "  ----->  " + rabbitCount);
    }

    /**
     * 获取某个月份兔子的数量
     * @param month 月份
     */
    private static int getRabbitCount(int month){
        if (month < 1){
            return 0;
        }

        if (month == 1){
            return 1;
        }

        return getBabyishRabbitCount(month) + getYoungRabbitCount(month) + getAdultRabbitCount(month);
    }

    /**
     * 成年兔数量
     */
    private static int getAdultRabbitCount(int month){

        if (month == 1){
            return  0;
        }

        return getAdultRabbitCount(month - 1) + getYoungRabbitCount(month - 1);
    }

    /**
     * 婴儿兔数量
     */
    private static int getBabyishRabbitCount(int month){

        if (month == 1){
            return 1;
        }

        return getAdultRabbitCount(month - 1) + getYoungRabbitCount(month - 1);
    }

    /**
     * 幼年兔数量
     */
    private static int getYoungRabbitCount(int month){

        if (month == 1){
            return 0;
        }

        return getBabyishRabbitCount(month - 1);
    }
}
